/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package progettode_co.Test;

/**
 *
 * @author Domenico
 */
//i package scaricati
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFRenderer;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;

/**
*
* @author LBartoli
* La classe che effettua la stampa
*/
public class PrintPDF implements Printable
{
	//il file che verrà stampato, è una classe di com.sun.pdfview
	private PDFFile file; 

	//Il costruttore che accetta il file da stampare
	public PrintPDF(PDFFile file)
	{
		this.file = file;
	}
	//Il metodo print è di Printable viene qui definito
    @Override
	public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException
	{
		//Converto l'indice che il metodo mi passa in automatico nell'idice che serve a PDFFile
		int pagenum = pageIndex + 1; 

		// Controllo se l'indice si trova nel range di pagine disponibili
		if ((pagenum >= 1) && (pagenum <= file.getNumPages()))
		{
			// Preparo graphics
			Graphics2D g2 = (Graphics2D) graphics;
			//Prendo la pagina corrente
			PDFPage page = file.getPage(pagenum);
			//Predo le sue dimensioni
			double pwidth = pageFormat.getImageableWidth();
			double pheight = pageFormat.getImageableHeight();
			//Il rapporto fra le dimensioni per determinare l'orientamento della pagina
			double aspect = page.getAspectRatio(); 

			// Il rapporto della pagina su cui dovrò stampare
			double paperaspect = pwidth / pheight; 

			// Se è minore di uno sto stampando in un foglio verticale (PORTRAIT)
			if (paperaspect < 1.0)
			{
				// non ho ben capito perchè gira il formato tra LANDSCAPE e PORTRAIT in ogni caso solo se l'orientamento della stampante è PORTRAIT
				switch (pageFormat.getOrientation())
				{
					case PageFormat.REVERSE_LANDSCAPE:
					case PageFormat.LANDSCAPE:
						pageFormat.setOrientation(PageFormat.PORTRAIT);
						break;
					case PageFormat.PORTRAIT:
						pageFormat.setOrientation(PageFormat.LANDSCAPE);
						break;
                                            
				} 

				// ricalcola lorientamento
				pwidth = pageFormat.getImageableWidth();
				pheight = pageFormat.getImageableHeight();
				paperaspect = pwidth / pheight;
			} 

			int width;
			int height; 

			// a questo punto controllando i rapporti della pagina con la stampante si cerca di ridimensionare il contenuto
			if (aspect > paperaspect)
			{
				// paper is too tall / pdfpage is too wide
				height = (int) (pwidth / aspect);
				width = (int) pwidth;
			}
			else
			{
				// paper is too wide / pdfpage is too tall
				width = (int) (pheight * aspect);
				height = (int) pheight;
			} 

			//Setto il rettangolo per la stampa con i valori risultanti
			Rectangle imgbounds = new Rectangle((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY(), width, height); 

			//Fa il render della pagina
			PDFRenderer pgs = new PDFRenderer(page, g2, imgbounds, null, null); 

			try
			{
				//attende fino a che il render non è terminato
				page.waitForFinish();
				//Viene lanciato il thread per la stampa
				pgs.run();
			}
			catch (InterruptedException ie)
			{ 

			} 

			// ritorno che la pagina è stampabile
			return PAGE_EXISTS;
		}
		else
		{
			//La pagina non esiste o non è stampabile
			return NO_SUCH_PAGE;
		}
	}
}